package com.apanal.qlife.sys.service;

import java.util.List;
import java.util.Set;

import com.apanal.qlife.common.aop.UserAuthCacheAspect;
import com.apanal.qlife.common.page.Page;
import com.apanal.qlife.common.page.PageReturn;
import com.apanal.qlife.sys.model.Resource;
import com.apanal.qlife.sys.model.User;

/**
 * 资源服务层接口<br>
 * 缓存实现:{@link UserAuthCacheAspect}
 * 
 * @author shuliangxing
 * 
 * @date 2015-1-14上午11:33:49
 */
public interface ResourceService {

	/**
	 * 根据id物理删除,包括子资源
	 * 
	 * @param id
	 * @return
	 */
	String deleteById(Long id);

	/**
	 * 新增
	 * 
	 * @param record
	 * @return
	 */
	String insert(Resource record);

	/**
	 * 非空字段新增
	 * 
	 * @param record
	 * @return
	 */
	String insertSelective(Resource record);

	/**
	 * 根据id查询
	 * 
	 * @param id
	 * @return
	 */
	Resource selectById(Long id);

	/**
	 * 非空字段更新
	 * 
	 * @param record
	 * @return
	 */
	String updateByIdSelective(Resource record);

	/**
	 * 更新
	 * 
	 * @param record
	 * @return
	 */
	String updateById(Resource record);

	// 分割线

	/**
	 * 查询所有
	 * 
	 * @return
	 */
	List<Resource> selectAll();

	/**
	 * 查询所有正常状态的数据
	 * 
	 * @return
	 */
	List<Resource> selectAllNormal();

	/**
	 * 分页查询
	 * 
	 * @param entity
	 * @param page
	 * @return
	 */
	PageReturn<Resource> selectForPage(Resource entity, Page page);

	/**
	 * 软删除
	 * 
	 * @param id
	 *            id
	 * @param useId
	 *            操作人id
	 * @return
	 */
	String deleteSoft(Long id, Long useId);

	/**
	 * 根据用户查询权限集合,已实现缓存相应功能
	 * 
	 * @param useId
	 * @return
	 */
	Set<String> findPermissionsByUser(User user);

	/**
	 * 根据用户权限得到菜单
	 * 
	 * @param permissions
	 * @return
	 */
	List<Resource> findMenus(Set<String> permissions);

	/**
	 * 根据用户权限得到菜单,并按层级封装
	 * 
	 * @param permissions
	 * @return
	 */
	Resource findMenusForLevel(Set<String> permissions);

	/**
	 * 根据用户得到菜单,并按层级封装,此方法已加缓存
	 * 
	 * @param permissions
	 * @return
	 */
	Resource findMenusForLevel(User user);

	/**
	 * 查询所有菜单资源
	 * 
	 * @return
	 */
	List<Resource> selectAllMenu();

	/**
	 * 查询所有按钮资源
	 * 
	 * @return
	 */
	List<Resource> selectAllButton();

	/**
	 * 检查资源名是否存在,修改时排除当前资源名称
	 * 
	 * @param resId
	 *            资源id,新增时传0
	 * @param resName
	 *            资源名称
	 * @return true:存在 false:不存在
	 */
	Boolean checkResourceNameExist(Long resId, String resName);

	/**
	 * 启用/停用
	 * 
	 * @param resource
	 * @return
	 */
	String updateToEnableOrDisable(Resource resource);

	/**
	 * 根据角色id查询资源
	 * 
	 * @param rolId
	 * @return
	 */
	List<Resource> selectByRolId(Long rolId);

	/**
	 * 根据群组id查询资源
	 * 
	 * @param groId
	 * @return
	 */
	List<Resource> selectByGroId(Long groId);

	/**
	 * 获得资源授权树集合
	 * 
	 * @return
	 */
	List<Resource> selectResourceAuthTree();
}
